package zhujie.demo2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *  通过反射的方法动态操作:构造器，方法，属性
 */
public class demo1 {
    public static void main(String[] args) {
        String path = "zhujie.demo2.Student";
        try {
            Class clz = Class.forName(path);

            //通过反射api动态调用构造方法，构造对象
            Student s = (Student) clz.newInstance();//其实是调用了Student的无参构造方法

            Constructor c1 = clz.getDeclaredConstructor(String.class,int.class,String.class);//调用有参构造器
            Student s1 = (Student) c1.newInstance("张哲",18,"jinan");
            System.out.println(s1.getAddress());

            //通过反射api动态调用普通方法   好处可以动态的指定方法和值
            Student s2 = (Student) clz.newInstance();
            Method method = clz.getDeclaredMethod("setName", String.class);
            method.invoke(s2,"王狗屎");//s2.setName("王狗屎");
            System.out.println(s2.getName());

            //通过反射api操作属性
            Student s3 = (Student) clz.newInstance();
            Field f = clz.getDeclaredField("name");
            f.setAccessible(true);//这个属性不用做安全检查了，就可以访问到私有属性
            f.set(s3,"张哲");//通过反射设值
            System.out.println(s3.getName());//调用对象的方法
            System.out.println(f.get(s3));//通过反射调用的
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
